Google Cloud Batch のジョブに Cloud Storage をマウントしてストレージ上のスクリプトを実行してみた

Google Cloud Batch のジョブに Cloud Storage をマウントしてストレージ上のスクリプトを実行してみた

Clock Icon2024.10.24

Google Cloud データエンジニアのはんざわです。
前回のブログで Google Cloud の Batch を使って、Cloud Storage のファイルを解凍する方法を紹介しました。

https://dev.classmethod.jp/articles/google-cloud-try-batch

今回のブログでは、Batch に Cloud Storage をマウントし、ストレージに配置したスクリプトを実行する方法を紹介します。

スクリプトの実行方法

前回のブログでも紹介したとおり、Batch ではコンテナイメージを使用して実行する方法と、直接スクリプトから実行する方法の2つがあります。

さらに直接スクリプトから実行する方法にも2つの方法があります。

  1. Batch API に直接スクリプトを渡す方法
  2. 事前にスクリプトファイルを配置したストレージボリュームにマウントする方法

前回のブログで実行した以下のコマンドは、前者の「Batch API に直接スクリプトを渡す方法」に該当します。

$ gcloud beta batch jobs submit \
      --location asia-northeast1 \
      --config ./job.json \
      --script-text "$(cat ./script.sh)"

今回のブログでは、後者の方法でスクリプトを実行する手順を紹介します。

やりたいこと

今回やりたいことは、以下のとおりです。

  • Cloud Storage に実行するスクリプトファイルを配置する
  • Batch に Cloud Storage をマウントし、ストレージ上のスクリプトを呼び出す

参考:Cloud Storage バケットを使用する

事前準備

一部のリソースは、前回の検証で使用したものを再利用します。

  • サービスアカウント
  • 圧縮されたファイルを保管する Cloud Storage
  • 解凍したファイルを保管する Cloud Storage
  • 実行するスクリプト

1. Cloud Storage

以下のコマンドで、Batch のジョブが実行される Compute Engine がマウントするための Cloud Storage を作成します。

# Batch がマウントする Cloud Storage を作成
$ gcloud storage buckets create gs://hanzawa-yuya-batch-mount \
    --location=asia-northeast1 \
    --uniform-bucket-level-access

2. スクリプトファイルを Cloud Storage にアップロード

以下のコマンドで、スクリプトファイルをマウントされる Cloud Storage にアップロードします。

$ gcloud storage cp ./script.sh gs://hanzawa-yuya-batch-mount/test/

3. Batch

https://cloud.google.com/batch/docs/reference/rest/v1/projects.locations.jobs

ジョブの定義ファイルを準備します。
前回作成したものとほとんど同じですが、異なる部分だけハイライトしています。
変更点の概要は以下のとおりです。

  • runnables[].script.path で Compute Engine のスクリプトファイルのパスを指定
  • volumes[].gcs.remotePath で Cloud Storage のリモートパスを指定
  • volumes[].mountPath でストレージボリュームのマウントパスを指定

それぞれのパラメータの詳細については、上記の REST API Resource の公式ドキュメントを参考にしてください。

job.json
{
    "taskGroups": [
        {
            "taskSpec": {
+               "runnables": [
+                   {
+                       "script": {
+                           "path": "/scripts/script.sh"
+                       }
+                   }
+               ],
                "computeResource": {
                    "cpuMilli": "500",
                    "memoryMib": "500"
                },
                "environment": {
                    "variables": {
                        "FILE_PATH": "test/sample.csv.gz",
                        "INPUT_BUCKET": "hanzawa-yuya-compressed-files",
                        "OUTPUT_BUCKET": "hanzawa-yuya-uncompressed-files"
                    }
                },
+               "volumes": [
+                   {
+                       "gcs": {
+                           "remotePath": "hanzawa-yuya-batch-mount/test"
+                       },
+                       "mountPath": "/scripts"
+                   }
+               ]
            }
        }
    ],
    "allocationPolicy": {
        "location": {
            "allowedLocations": [
                "regions/asia-northeast1"
            ]
        },
        "instances": [
            {
                "policy": {
                    "machineType": "e2-micro",
                    "provisioningModel": "STANDARD"
                }
            }

        ],
        "serviceAccount": {
            "email": "sa-batch@<PROJECT_ID>.iam.gserviceaccount.com"
        }
    },
    "logsPolicy": {
        "destination": "CLOUD_LOGGING"
    }
}

動かしてみる

早速、動かしてみます。以下のコマンドで Batch ジョブを作成します。

$ gcloud beta batch jobs submit \
      --location asia-northeast1 \
      --config ./job.json

期待通り、解凍処理が正常に行われました。
また、ログを確認すると Cloud Storage へのマウントも成功していました。

スクリーンショット 2024-10-24 21.30.57

ログからもわかるように、Cloud Storage のマウントには gcsfuse が使用されています。gcsfuse は、Cloud Storage をローカルファイルシステムとしてマウントするためのツールです。
詳細は以下のドキュメントを参照してください。

https://cloud.google.com/storage/docs/gcs-fuse?hl=ja

まとめ

本ブログでは、Google Cloud Batch のジョブに Cloud Storage をマウントしてストレージ上のスクリプトを実行してみました。
今回の検証ではスクリプトの読み取りのみを行いましたが、Cloud Storage にファイルを書き込むことも可能ですので、ぜひ試してみてください。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.